/******************************************************************************
 * 文 件 名   : sys.c
 * 版 本 号   : V1.0
 * 作    者   : pinot
 * 生成日期   : 2019年11月01日
 * 功能描述   : 初始化T5L ASIC 的寄存器
 * 修改历史   :
 * 日    期   :
 * 作    者   :
 * 修改内容   :
 ******************************************************************************/

/*****************************************************************************
自定义头文件*/
#include "sys.h"
#include "uart.h"
#include "timer.h"
#include "T5L_lib.h"
/*****************************************************************************
全局变量*/
data _TKS_FLAGA_type MSFlag;
/*****************************************************************************
延时us*//*振荡周期T=1/206438400*/
// void DelayUs(uint16_t n)
//{
//  uint16_t i,j;
//  for(i=0;i<n;i++)
//    for(j=0;j<15;j++);
//}
/*****************************************************************************
延时ms*/
void DelayMs(uint16_t n)
{
    SysDelayTick = n;
    while (SysDelayTick)
        ;
}
/*****************************************************************************
初始化T5L必须配置的寄存器*/
// void InitCFG(void)
//{
//  CKCON      = 0x00;
//  T2CON      = 0x70;
//  DPC        = 0x00;
//  PAGESEL    = 0x01;
//  D_PAGESEL  = 0x02;
//  MUX_SEL    = 0x60;
//  PORTDRV    = 0x01;
//  RAMMODE    = 0x00;
//}

/*****************************************************************************
中断配置*/
void InitInt(void)
{
    initcpu();
    // IEN0 = 0x00; /*关闭所有中断*/
    // IEN1 = 0x00;
    // IEN2 = 0x00;
    // IP0  = 0x00; /*中断优先级默认*/
    // IP1  = 0x00;
}
/*****************************************************************************
GPIO输出*/
void InitGPIO(void)
{
    // IO口配置
    P0 = 0x00;
    P1 = 0x00;
    P2 = 0x00;
    P3 = 0x00;
    P0MDOUT |= 0x02;  //初始化P0.1为输出，485控制
    P1MDOUT |= 0x1E;  //初始化P1.1 P1.2 P1.3 P1.4为输出
    P2MDOUT |= 0x02;  //初始化P2.1为输出
    P3MDOUT = 0x00;
}
void EX0_ISR_PC(void) interrupt 0
{
    EA = 0;

    EA = 1;
}
void EX1_ISR_PC(void) interrupt 2
{
    EA = 0;

    EA = 1;
}
/*****************************************************************************
初始化T5L ASIC*/
void InitSys(void)
{
    EA = 0;
    //  InitCFG();      /*改为在A51启动文件初始化*/
    InitInt();
    InitGPIO();
    InitTimer();
    InitUart();
    WDT_ON();
    EA = 1;
}

/*****************************************************************************
 函 数 名  : void read_dgus_vp(u32 addr,u8* buf,u16 len)
 功能描述  : 读dgus地址的值
 输入参数  :	 addr：dgus地址值  len：读数据长度
 输出参数  : buf：数据保存缓存区
 修改历史  :
  1.日    期   : 2019年4月2日
    作    者   : chengjing
    修改内容   : 创建
*****************************************************************************/
void read_dgus_vp(u32 addr, u8* buf, u16 len)
{
    u32 OS_addr = 0, OS_addr_offset = 0;
    u16 OS_len = 0, OS_len_offset = 0;
    OS_addr        = addr / 2;
    OS_addr_offset = addr % 2;
    ADR_H          = (u8)(OS_addr >> 16) & 0xFF;
    ADR_M          = (u8)(OS_addr >> 8) & 0xFF;
    ADR_L          = (u8)OS_addr & 0xFF;
    ADR_INC        = 1;       // DGUS  OS存储器地址在读写后自动加1
    RAMMODE        = 0xAF;    //启动读模式
    if (OS_addr_offset == 1)  //首地址有偏移，修正
    {
        while (APP_ACK == 0)
            ;  //等待
        APP_EN = 1;
        while (APP_EN == 1)
            ;
        *buf++ = DATA1;
        *buf++ = DATA0;
        len--;
        OS_addr_offset = 0;
    }
    OS_len        = len / 2;
    OS_len_offset = len % 2;
    if (OS_len_offset == 1)
    {
        OS_len++;
    }
    while (OS_len--)
    {
        if ((OS_len_offset == 1) && (OS_len == 0))
        {
            while (APP_ACK == 0)
                ;
            APP_EN = 1;
            while (APP_EN == 1)
                ;  //读写执行结束
            *buf++ = DATA3;
            *buf++ = DATA2;
            break;
        }
        while (APP_ACK == 0)
            ;
        APP_EN = 1;
        while (APP_EN == 1)
            ;  //读写执行结束
        *buf++ = DATA3;
        *buf++ = DATA2;
        *buf++ = DATA1;
        *buf++ = DATA0;
    }
    RAMMODE = 0x00;  //读写完成后RAMMODE必须置零
    return;
}

/*****************************************************************************
 函 数 名  : void write_dgus_vp(u32 addr,u8* buf,u16 len)
 功能描述  : 写dgus地址数据
输入参数  :	 addr：写地址值	buf：写入的数据保存缓存区 len：字长度
 输出参数  :
 修改历史  :
  1.日    期   : 2019年4月2日
    作    者   : chengjing
    修改内容   : 创建
*****************************************************************************/
void write_dgus_vp(u32 addr, u8* buf, u16 len)
{
    u32 OS_addr = 0, OS_addr_offset = 0;
    u16 OS_len = 0, OS_len_offset = 0;
    EA             = 0;
    OS_addr        = addr / 2;
    OS_addr_offset = addr % 2;
    ADR_H          = (u8)(OS_addr >> 16) & 0xFF;
    ADR_M          = (u8)(OS_addr >> 8) & 0xFF;
    ADR_L          = (u8)OS_addr & 0xFF;
    ADR_INC        = 0x01;  // DGUS  OS存储器地址在读写后自动加1
    RAMMODE        = 0x8F;  //启动写模式
    if (OS_addr_offset == 1)
    {
        ADR_INC = 0;
        RAMMODE = 0xAF;
        while (APP_ACK == 0)
            ;
        APP_EN = 1;
        while (APP_EN == 1)
            ;  //读写执行结束
        ADR_INC = 0x01;
        RAMMODE = 0x8F;
        while (APP_ACK == 0)
            ;
        DATA1  = *buf++;
        DATA0  = *buf++;
        APP_EN = 1;
        while (APP_EN == 1)
            ;  //读写执行结束
        len--;
        OS_addr_offset = 0;
    }
    OS_len        = len / 2;
    OS_len_offset = len % 2;
    if (OS_len_offset == 1)
    {
        OS_len++;
    }
    while (OS_len--)
    {
        if ((OS_len_offset == 1) && (OS_len == 0))
        {
            ADR_INC = 0;
            RAMMODE = 0xAF;
            while (APP_ACK == 0)
                ;
            APP_EN = 1;  //增加一个读过程，以免写单字时会将另一个单字写0
            while (APP_EN == 1)
                ;  //读写执行结束
            ADR_INC = 0x01;
            RAMMODE = 0x8F;
            while (APP_ACK == 0)
                ;
            DATA3  = *buf++;
            DATA2  = *buf++;
            APP_EN = 1;
            while (APP_EN == 1)
                ;  //读写执行结束
            break;
        }
        while (APP_ACK == 0)
            ;
        DATA3  = *buf++;
        DATA2  = *buf++;
        DATA1  = *buf++;
        DATA0  = *buf++;
        APP_EN = 1;
        while (APP_EN == 1)
            ;  //读写执行结束
    }
    RAMMODE = 0x00;  //读写完成后RAMMODE必须置零
    EA      = 1;
    return;
}